﻿/*
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
*
* == BEGIN LICENSE ==
*
* Licensed under the terms of any of the following licenses at your
* choice:
*
*  - GNU General Public License Version 2 or later (the "GPL")
*    http://www.gnu.org/licenses/gpl.html
*
*  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
*    http://www.gnu.org/licenses/lgpl.html
*
*  - Mozilla Public License Version 1.1 or later (the "MPL")
*    http://www.mozilla.org/MPL/MPL-1.1.html
*
* == END LICENSE ==
*
* Compatibility code for Adobe AIR.
*/

if (FCKBrowserInfo.IsAIR) {
    var FCKAdobeAIR = (function () {
        /*
        * ### Private functions.
        */

        var getDocumentHead = function (doc) {
            var head;
            var heads = doc.getElementsByTagName('head');

            if (heads && heads[0])
                head = heads[0];
            else {
                head = doc.createElement('head');
                doc.documentElement.insertBefore(head, doc.documentElement.firstChild);
            }

            return head;
        };

        /*
        * ### Public interface.
        */
        return {
            FCKeditorAPI_Evaluate: function (parentWindow, script) {
                // TODO : This one doesn't work always. The parent window will
                // point to an anonymous function in this window. If this
                // window is destroyied the parent window will be pointing to
                // an invalid reference.

                // Evaluate the script in this window.
                eval(script);

                // Point the FCKeditorAPI property of the parent window to the
                // local reference.
                parentWindow.FCKeditorAPI = window.FCKeditorAPI;
            },

            EditingArea_Start: function (doc, html) {
                // Get the HTML for the <head>.
                var headInnerHtml = html.match(/<head>([\s\S]*)<\/head>/i)[1];

                if (headInnerHtml && headInnerHtml.length > 0) {
                    // Inject the <head> HTML inside a <div>.
                    // Do that before getDocumentHead because WebKit moves
                    // <link css> elements to the <head> at this point.
                    var div = doc.createElement('div');
                    div.innerHTML = headInnerHtml;

                    // Move the <div> nodes to <head>.
                    FCKDomTools.MoveChildren(div, getDocumentHead(doc));
                }

                doc.body.innerHTML = html.match(/<body>([\s\S]*)<\/body>/i)[1];

                //prevent clicking on hyperlinks and navigating away
                doc.addEventListener('click', function (ev) {
                    ev.preventDefault();
                    ev.stopPropagation();
                }, true);
            },

            Panel_Contructor: function (doc, baseLocation) {
                var head = getDocumentHead(doc);

                // Set the <base> href.
                head.appendChild(doc.createElement('base')).href = baseLocation;

                doc.body.style.margin = '0px';
                doc.body.style.padding = '0px';
            },

            ToolbarSet_GetOutElement: function (win, outMatch) {
                var toolbarTarget = win.parent;

                var targetWindowParts = outMatch[1].split('.');
                while (targetWindowParts.length > 0) {
                    var part = targetWindowParts.shift();
                    if (part.length > 0)
                        toolbarTarget = toolbarTarget[part];
                }

                toolbarTarget = toolbarTarget.document.getElementById(outMatch[2]);
            },

            ToolbarSet_InitOutFrame: function (doc) {
                var head = getDocumentHead(doc);

                head.appendChild(doc.createElement('base')).href = window.document.location;

                var targetWindow = doc.defaultView;

                targetWindow.adjust = function () {
                    targetWindow.frameElement.height = doc.body.scrollHeight;
                };

                targetWindow.onresize = targetWindow.adjust;
                targetWindow.setTimeout(targetWindow.adjust, 0);

                doc.body.style.overflow = 'hidden';
                doc.body.innerHTML = document.getElementById('xToolbarSpace').innerHTML;
            }
        };
    })();

    /*
    * ### Overrides
    */
    (function () {
        // Save references for override reuse.
        var _Original_FCKPanel_Window_OnFocus = FCKPanel_Window_OnFocus;
        var _Original_FCKPanel_Window_OnBlur = FCKPanel_Window_OnBlur;
        var _Original_FCK_StartEditor = FCK.StartEditor;

        FCKPanel_Window_OnFocus = function (e, panel) {
            // Call the original implementation.
            _Original_FCKPanel_Window_OnFocus.call(this, e, panel);

            if (panel._focusTimer)
                clearTimeout(panel._focusTimer);
        }

        FCKPanel_Window_OnBlur = function (e, panel) {
            // Delay the execution of the original function.
            panel._focusTimer = FCKTools.SetTimeout(_Original_FCKPanel_Window_OnBlur, 100, this, [e, panel]);
        }

        FCK.StartEditor = function () {
            // Force pointing to the CSS files instead of using the inline CSS cached styles.
            window.FCK_InternalCSS = FCKConfig.BasePath + 'css/fck_internal.css';
            window.FCK_ShowTableBordersCSS = FCKConfig.BasePath + 'css/fck_showtableborders_gecko.css';

            _Original_FCK_StartEditor.apply(this, arguments);
        }
    })();
}
